#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include "mycode/login.h"
#include "mycode/widget.h"
void test1()//窗口
{
    //创建窗口
    lv_obj_t * obj = lv_obj_create(lv_scr_act());

    //设置窗口位置
    lv_obj_set_pos(obj,100,200);
    lv_obj_set_size(obj,200,200);

    static lv_style_t obj_style;
    //初始化样式
    lv_style_init(&obj_style);

    //设置背景颜色
    lv_color_t bg_color={192,192,192};//灰色
    lv_style_set_bg_color(&obj_style,bg_color);

    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&obj_style,255);

    //设置边框宽度
    lv_style_set_border_width(&obj_style,3);

    //设置边框颜色
    lv_color_t border_color = {0,0,0};//黑色 
    lv_style_set_border_color(&obj_style,border_color);

    //设置边框透明度
    lv_style_set_border_opa(&obj_style,255);

    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&obj_style,5);

    //给对象增加样式，默认状态下生效
    lv_obj_add_style(obj,&obj_style,LV_STATE_DEFAULT);
}

void test2()//标签
{
    //创建标签
    lv_obj_t * label = lv_label_create(lv_scr_act());
    
    //标签位置
    lv_obj_set_pos(label,100,100);

    //标签大小
    lv_obj_set_size(label,100,75);

    static lv_style_t label_style;
    //初始化样式
    lv_style_init(&label_style);

    //设置背景颜色
    lv_color_t bg_color={255,255,255};//白色
    lv_style_set_bg_color(&label_style,bg_color);

    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&label_style,255);

    //设置边框宽度
    lv_style_set_border_width(&label_style,3);

    //设置边框颜色
    lv_color_t border_color = {255,0,0};//蓝色 
    lv_style_set_border_color(&label_style,border_color);

    //设置边框透明度
    lv_style_set_border_opa(&label_style,255);

    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&label_style,5);

    //设置文本
    lv_label_set_text(label,"user_name");

    // int a = 21;
    // char b = 'q';//单引号
    // double c = 1.83;
    // lv_label_set_text_fmt(label,"%d%c%lf",a,b,c);//%lf要改一个地方

    //设置文本字体大小

    lv_style_set_text_font(&label_style,&lv_font_montserrat_24);
    //设置字体颜色
    lv_style_set_text_color(&label_style,lv_color_hex(0x00ff00));

    //给对象增加样式，默认状态下生效
    lv_obj_add_style(label,&label_style,LV_STATE_DEFAULT);

}

void test3()
{
    init_label_style();
    lv_obj_t *lab1 = lv_label_create(lv_scr_act());
    lv_obj_set_pos(lab1,0,0);
    lv_obj_set_size(lab1,100,50);
    lv_label_set_text(lab1,"lab1");
    lv_obj_add_style(lab1,&label_style,LV_STATE_DEFAULT);
}

void test4()
{
    lv_obj_t *lab2 = lv_label_create(lv_scr_act());
    lv_obj_set_pos(lab2,400,100);
    lv_obj_set_size(lab2,100,50);
    lv_label_set_text(lab2,"lab2");
    lv_obj_add_style(lab2,&label_style,LV_STATE_DEFAULT);
}

//按钮1的回调函数
void button_all_event_cb(lv_event_t *e)
{
    //数据回调
    int *p = (int *)lv_event_get_user_data(e);
    printf("用户数据为:%d",p);

    //事件类型回调
    lv_event_code_t code = lv_event_get_code(e);
    if(code==LV_EVENT_PRESSED)
    {
        printf("按钮被按下了\n");
    }
    if(code==LV_EVENT_LONG_PRESSED)
    {
        printf("按钮被长按了\n");
    }
    if(code==LV_EVENT_CLICKED)
    {
        printf("按钮被单击了\n");
    }    
    if(code==LV_EVENT_RELEASED)
    {
        printf("按钮被松开了\n");
    }
    if(code==LV_EVENT_FOCUSED)
    {
        printf("按钮聚焦\n");
    }
    if(code==LV_EVENT_DEFOCUSED)
    {
        printf("按钮失去聚焦\n");
    }
}
//按钮2的回调函数
void button2_all_event_cb(lv_event_t * e)
{
    lv_obj_t * but = lv_event_get_user_data(e);
    //由于这个函数是 but按钮的所有事件的回调函数
    //到底是什么事件？需要进行区分
    lv_event_code_t code = lv_event_get_code(e);
    if(code == LV_EVENT_PRESSED)
    {
        printf("按钮被按下了，隐藏按钮\n");
        lv_obj_add_flag(but,LV_OBJ_FLAG_HIDDEN);
    }
    else if(code == LV_EVENT_RELEASED)
    {
        printf("按钮被松开了，显示按钮\n");
        lv_obj_remove_flag(but,LV_OBJ_FLAG_HIDDEN);
    }
}
//按钮3的回调函数
void button3_all_event_cb(lv_event_t * e)
{
    //获取触发事件的对象的地址，也就是按钮的地址
    lv_obj_t * but = lv_event_get_target(e);
    //由于这个函数是 but按钮的所有事件的回调函数
    //到底是什么事件？需要进行区分
    lv_event_code_t code = lv_event_get_code(e);
    if(code == LV_EVENT_PRESSED)
    {
        printf("按钮被按下了，隐藏按钮\n");
        lv_obj_add_flag(but,LV_OBJ_FLAG_HIDDEN);
    }
    else if(code == LV_EVENT_RELEASED)
    {
        printf("按钮被松开了，显示按钮\n");
        lv_obj_remove_flag(but,LV_OBJ_FLAG_HIDDEN);
    }
}
//按钮方式
void test5()
{
    //创建按钮
    lv_obj_t *but = lv_button_create(lv_scr_act());

    //标签位置
    lv_obj_set_pos(but,250,100);

    //标签大小
    lv_obj_set_size(but,100,100);

    static lv_style_t but_style;
    //初始化样式
    lv_style_init(&but_style);

    //设置背景颜色
    lv_color_t bg_color={192,192,192};//灰色
    lv_style_set_bg_color(&but_style,bg_color);

    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&but_style,255);

    //设置边框宽度
    lv_style_set_border_width(&but_style,3);

    //设置边框颜色 ，黑色
    lv_style_set_border_color(&but_style,lv_color_hex(0));

    //设置边框透明度
    lv_style_set_border_opa(&but_style,255);

    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&but_style,5);

    //设置文本字体大小
    lv_style_set_text_font(&but_style,&lv_font_montserrat_40);

    //设置字体颜色
    lv_style_set_text_color(&but_style,lv_color_hex(0xff0000));

    lv_obj_add_style(but,&but_style,LV_STATE_DEFAULT);

    //设置按钮被按下时的样式
    static lv_style_t but_style2;
    //初始化样式
    lv_style_init(&but_style2);

    //设置背景颜色
    lv_style_set_bg_color(&but_style2,bg_color);

    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&but_style2,255);

    //设置边框宽度
    lv_style_set_border_width(&but_style2,3);

    //设置边框颜色 ，红色
    lv_style_set_border_color(&but_style2,lv_color_hex(0xff0000));

    //设置边框透明度
    lv_style_set_border_opa(&but_style2,255);

    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&but_style2,5);

    //设置文本字体大小
    lv_style_set_text_font(&but_style2,&lv_font_montserrat_40);

    //设置字体颜色
    lv_style_set_text_color(&but_style2,lv_color_hex(0xff0000));

    lv_obj_add_style(but,&but_style2,LV_STATE_PRESSED);


    //创建标签，以按钮为父对象
    lv_obj_t *lab = lv_label_create(but);
    lv_label_set_text(lab,"login");

    //只要but这个按钮发生任何事件，都会自动调用 button_all_event_cb 函数
    //lv_obj_add_event_cb(but,button_all_event_cb,LV_EVENT_ALL,NULL);//没有传递用户数据
    //如果需要传递用户数据，假设需要传递一个int数据
    static int data=100;//要传递给回调函数的用户数据不能随代码块持续性，否则
                    //当前函数结束后，data释放了，在回调函数中那个地址就是野指针了
    lv_obj_add_event_cb(but,button_all_event_cb,LV_EVENT_ALL,&data);

}
//隐藏按钮
void test6()
{
    lv_obj_t * but = lv_button_create(lv_scr_act());
    lv_obj_set_pos(but,0,0);
    lv_obj_set_size(but,50,50);

    //lv_obj_add_event_cb(but,button2_all_event_cb,LV_EVENT_ALL,(void*)but);
    lv_obj_add_event_cb(but,button3_all_event_cb,LV_EVENT_ALL,NULL);


}

//文本输入框 和软键盘
void test7()
{
    //创建文本输入框1
    lv_obj_t * ta1 = lv_textarea_create(lv_scr_act());

    //设置大小及位置
    lv_obj_set_size(ta1,200,50);
    lv_obj_set_pos(ta1,50,60);

    //创建文本输入框2
    lv_obj_t * ta2 = lv_textarea_create(lv_scr_act());
    //设置大小及位置
    lv_obj_set_size(ta2,200,50);
    lv_obj_set_pos(ta2,50,160);

    //创建软键盘
    lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
    //软键盘在默认状态下隐藏
    lv_obj_add_flag(kb,LV_OBJ_FLAG_HIDDEN);



    //聚焦在文本框1
    lv_obj_add_event_cb(ta1,button_all_event_cb,LV_EVENT_FOCUSED,NULL);
    //软键盘解除隐藏
    lv_obj_remove_flag(kb,LV_OBJ_FLAG_HIDDEN);
    //关联软键盘和文本输入框1
    lv_keyboard_set_textarea(kb,ta1);

    //聚焦在文本框2
    lv_obj_add_event_cb(ta2,button_all_event_cb,LV_EVENT_FOCUSED,NULL);
    //软键盘解除隐藏
    lv_obj_remove_flag(kb,LV_OBJ_FLAG_HIDDEN);
    //关联软键盘和文本输入框2
    lv_keyboard_set_textarea(kb,ta2);

    
}
void homework()
{
    //创建标签1(user_name)
    lv_obj_t * label1 = lv_label_create(lv_scr_act());
    //标签位置
    lv_obj_set_pos(label1,125,75);
    //标签大小
    lv_obj_set_size(label1,75,50);

    //创建标签2(password)
    lv_obj_t * label2 = lv_label_create(lv_scr_act());
    //标签位置
    lv_obj_set_pos(label2,125,175);
    //标签大小
    lv_obj_set_size(label2,75,50);

    static lv_style_t label_style;
    //初始化样式
    lv_style_init(&label_style);
    //设置背景颜色
    lv_color_t bg_color={255,255,255};//白色
    lv_style_set_bg_color(&label_style,bg_color);
    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&label_style,255);
    //设置边框宽度
    lv_style_set_border_width(&label_style,3);
    //设置边框颜色
    lv_color_t border_color = {253,252,159};//蓝色 
    lv_style_set_border_color(&label_style,border_color);
    //设置边框透明度
    lv_style_set_border_opa(&label_style,255);
    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&label_style,5);

    //设置文本
    lv_label_set_text(label1,"user_name");
    lv_label_set_text(label2,"password");
    //设置文本字体大小
    lv_style_set_text_font(&label_style,&lv_font_montserrat_22);
    //设置字体颜色
    lv_style_set_text_color(&label_style,lv_color_hex(0x0000ff));//蓝色
    //给对象增加样式，默认状态下生效
    lv_obj_add_style(label1,&label_style,LV_STATE_DEFAULT);
    lv_obj_add_style(label2,&label_style,LV_STATE_DEFAULT);


//按钮(login)
//创建按钮
    lv_obj_t * but = lv_button_create(lv_scr_act());
    //设置大小和位置
    lv_obj_set_size(but,100,50);
    lv_obj_set_pos(but,200,250);
    //设置按钮默认状态下的样式
    static lv_style_t but_style;
    //初始化样式
    lv_style_init(&but_style);

    //设置背景颜色
    lv_style_set_bg_color(&but_style,bg_color);

    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&but_style,255);

    //设置边框宽度
    lv_style_set_border_width(&but_style,3);

    //设置边框颜色 ，黑色
    lv_style_set_border_color(&but_style,lv_color_hex(0));

    //设置边框透明度
    lv_style_set_border_opa(&but_style,255);

    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&but_style,5);

    //设置文本字体大小
    lv_style_set_text_font(&but_style,&lv_font_montserrat_22);

    //设置字体颜色
    lv_style_set_text_color(&but_style,lv_color_hex(0x0000ff));

    lv_obj_add_style(but,&but_style,LV_STATE_DEFAULT);

    //设置按钮被按下时的样式
    static lv_style_t but_style2;
    //初始化样式
    lv_style_init(&but_style2);

    //设置背景颜色
    lv_style_set_bg_color(&but_style2,bg_color);

    //设置背景透明度， 0完全透明(意思是看不见)，255不透明
    lv_style_set_bg_opa(&but_style2,255);

    //设置边框宽度
    lv_style_set_border_width(&but_style2,3);

    //设置边框颜色 ，红色
    lv_style_set_border_color(&but_style2,lv_color_hex(0xff0000));

    //设置边框透明度
    lv_style_set_border_opa(&but_style2,255);

    //设置四个角的弧度,第二个参数对应半径,0表示90度（没有弧度），值越大，弧度越大
    lv_style_set_radius(&but_style2,5);

    //设置文本字体大小
    lv_style_set_text_font(&but_style2,&lv_font_montserrat_22);

    //设置字体颜色
    lv_style_set_text_color(&but_style2,lv_color_hex(0xff0000));

    lv_obj_add_style(but,&but_style2,LV_STATE_PRESSED);


    //创建标签，以按钮为父对象
    lv_obj_t *lab = lv_label_create(but);
    lv_label_set_text(lab,"login");

    


//文本框与软键盘
    //创建文本输入框1
    lv_obj_t * ta1 = lv_textarea_create(lv_scr_act());

    //设置大小及位置
    lv_obj_set_size(ta1,200,50);
    lv_obj_set_pos(ta1,220,75);

    //创建文本输入框2
    lv_obj_t * ta2 = lv_textarea_create(lv_scr_act());
    //设置大小及位置
    lv_obj_set_size(ta2,200,50);
    lv_obj_set_pos(ta2,220,175);

    //创建软键盘
    lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
    lv_obj_add_flag(kb,LV_OBJ_FLAG_HIDDEN);//默认是隐藏的，当某个文本输入框被聚焦时再显示

    lv_obj_add_event_cb(ta1,textarea_event_cb,LV_EVENT_ALL,(void*)kb);
    lv_obj_add_event_cb(ta2,textarea_event_cb,LV_EVENT_ALL,(void*)kb);

}

int main(void)
{
    //初始化lvgl
    lv_init();

    /*Linux frame buffer device init*/
    lv_display_t * disp = lv_linux_fbdev_create();
    lv_linux_fbdev_set_file(disp, "/dev/fb0");

    //初始化触摸屏
    lv_indev_t * indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event0");
    /*Create a Demo*/
    //下面两行是运行 lvgl自带的 demo程序
    //lv_demo_widgets();
    //lv_demo_widgets_start_slideshow();

    //在这里调用自己写的函数
    //test1();
    //test2();
    //test3();
    //test4();
    //test5();
    //test6();
    //test7();
    //homework();
    login_winwod();

    /*Handle LVGL tasks*/
    //循环检测事件的发生，并处理
    while(1) {
        lv_timer_handler();
        usleep(5000);
    }

    return 0;
}
